import axios from 'axios';
import * as tokenApis from './token.js';
import whiteList from '@/config/whiteList.js';
import useCookieStore from '@/stores/cookieStorage';
import { ElMessage } from 'element-plus';
import {AES_CBC_ENCRYPT} from '@/utils/jsencrypt.js';
import qs from 'qs';
import {removeToken} from './token.js';

import config1 from '@/config/index.js';

// Cookies.set('name', 'value', { expires: 7, path: '' })
// Cookies.remove('name')

// code:
// -1(未知错误)
// 1
// 2
// 10001
// 10008(请认证)


// console.log(encryptAES("123456"))


// 没有认证的请求跳转登录页吗，提示用户登录，但不强制跳转登录页，登录成功删除所有页面栈(清除history)入首页

// 设置基础 URL
// axios.defaults.baseURL = '';
axios.defaults.baseURL = '/servlet';

// 创建 axios 实例
// 本项目中对于params的数组有两种序列化方式，均有涉及
// qs.stringify({ids: [1, 2, 3]}, {arrayFormat: 'brackets'})
const service = axios.create({
	baseURL: axios.defaults.baseURL,
	timeout: 60000, // 请求超时时间
	paramsSerializer: (params) => qs.stringify(params, { arrayFormat: 'repeat' })
});

// 请求拦截器
service.interceptors.request.use(
	(config) => {
		// 对应sys_group表，本地3,4,5
		// if(!config.headers['gId']){
		
		// 	config.headers['gId'] = AES_CBC_ENCRYPT(`10`,config1.aes_key);
		// }

		// 从本地获取选择的考试科目，如果清除了缓存，则强制跳转到选择页面，选择页面初始化时请求已选择的考试科目，如果有再存到本地并重定向


		// 线上是6，，测试是10
		config.headers['gId'] = AES_CBC_ENCRYPT(`6`,config1.aes_key);
		config.headers['Dt'] = "pc";
		
		// 在发送请求之前做些什么
		// 例如，添加 token 到请求头

		// config.url.indexOf('login') != -1
		if (config.url.indexOf('login') != -1) {
			return config;
		} else {
			// console.log('非login接口');
			let token = tokenApis.getToken();
			if (token) {
				// config.headers[config1.header_token_key] = `Bearer ${token}`;
				
			} else {
				
				// if (!whiteList.includes(config.url)) {


				// if (!config.pass) {
				// 	let cancel;
				// 	// 设置cancelToken对象
				// 	config.cancelToken = new axios.CancelToken(function(c) {
				// 		cancel = c;
				// 	});

				// 	// tokenApis.removeToken();

				// 	// 取消请求怎么跳转触发登录事件呢
				// 	const cookieStore = useCookieStore();
				// 	cookieStore.setIsLogin(false);
				// 	ElMessage({
				// 		message: '请登录',
				// 		type: 'warning'
				// 	});
				// 	cancel();
				// 	// console.log('取消请求',config.url,token)
				// }
			}
			return config;
		}
	},
	(error) => {
		return Promise.reject(error);
	}
);

// 响应拦截器
service.interceptors.response.use(
	(response) => {
		if(!response.data){
			return response.data;
		}
		// 只返回数组等,没有code
		if(response.data.code==undefined){
			return response.data;
		}
		// 例如，处理成功响应
		if (response.data.code == 1) {
			return response.data;
		} else if (response.data.code == 10008) {
			// 弹出登录卡片并清空token
			tokenApis.removeToken();
			const cookieStore = useCookieStore();
			cookieStore.setIsLogin(false);
			ElMessage({
				message: '请登录',
				type: 'warning'
			});
			// 未知错误
		} else if (response.data.code == -1) {
			ElMessage({
				// message:response.data.message,
				message: '未知错误,请重试',
				type: 'warning'
			});
		} else if (response.data.code == 2) {
			ElMessage({
				message: response.data.message,
				type: 'warning'
			});
		} else if (response.data.code == 101) {
			tokenApis.removeToken();
			const cookieStore = useCookieStore();
			cookieStore.setIsLogin(false);
			ElMessage({
				message: response.data.message,
				type: 'warning'
			});
		}else {
			ElMessage({
				message: response.data.message,
				type: 'warning'
			});
		}
		return Promise.reject(response.data)
		// return response.data;
	},
	(error) => {
		if (error.response) {
			switch (error.response.status) {
				case 401:
					// 处理未授权的情况
					console.error('未授权，请重新登录');
					break;
				case 404:
					// 处理资源未找到的情况
					console.error('资源未找到');
					break;
				default:
					console.error('服务器错误');
			}
		} else if (error.request) {
			// 请求已发出，但没有收到响应
			console.error('请求超时或服务器无响应');
		} else {
			// 一些设置请求时发生错误
			console.error('请求配置错误:', error.message);
		}
		return Promise.reject(error);
	}
);

export const get = (url, params, config = {}) => service.get(url, { params, ...config });
export const post = (url, data, config) => service.post(url, data, config);
export const deleteRequest = (url, config) => service.delete(url,config);

export default service;
